local config_loader = {}

-- 引入配置常量
local config = require('Config/config')

-- 配置文件基础路径（从config.lua获取）
local CONFIG_BASE_PATH = config.CONFIG_PATHS.BASE_PATH



-- 简化的JSON解析函数（专门处理wildHang.json格式）
local function parse_json_simple(content)
    local result = {}
    
    -- 查找regions数组
    local regions_match = content:match('"regions"%s*:%s*%[(.-)%]')
    if not regions_match then
        print("[ERROR] 无法找到regions数组")
        return nil
    end
    
    -- 解析regions数组
    local regions = {}
    local region_pattern = '{%s*"name"%s*:%s*"([^"]+)"%s*,%s*"areas"%s*:%s*%[(.-)%]%s*}'
    for region_name, areas_content in regions_match:gmatch(region_pattern) do
        local region = {name = region_name, areas = {}}
        
        -- 解析areas数组
        if areas_content and areas_content ~= "" then
            local area_pattern = '{%s*"name"%s*:%s*"([^"]+)"%s*}'
            for area_name in areas_content:gmatch(area_pattern) do
                table.insert(region.areas, {name = area_name})
            end
        end
        
        table.insert(regions, region)
    end
    
    result.regions = regions
    return result
end

-- 解析嵌套JSON的函数
local function parse_nested_json(content)
    -- 使用懒人精灵自带的jsonLib
    if jsonLib and jsonLib.decode then
        local success, result = pcall(function()
            return jsonLib.decode(content)
        end)
        
        if success and result then
            print("[DEBUG] 使用jsonLib解析JSON成功")
            print("[DEBUG] 解析结果类型: " .. type(result))
            if type(result) == "table" then
                print("[DEBUG] 解析结果键数量: " .. (next(result) and "有内容" or "空表"))
            end
            return result
        else
            print("[DEBUG] jsonLib解析失败: " .. tostring(result))
            print("[DEBUG] 尝试使用内置解析器")
            return parse_nested_json_builtin(content)
        end
    else
        print("[DEBUG] jsonLib不可用，使用内置解析器")
        return parse_nested_json_builtin(content)
    end
end

-- 内置的嵌套JSON解析器
local function parse_nested_json_builtin(content)
    print("[DEBUG] 使用内置JSON解析器")
    
    -- 移除所有换行符和多余空格，简化解析
    content = content:gsub("\n", ""):gsub("\r", ""):gsub("%s+", " ")
    
    -- 简单的状态机解析器
    local result = {}
    local stack = {}
    local current = result
    local current_key = nil
    local i = 1
    
    while i <= #content do
        local char = content:sub(i, i)
        
        if char == "{" then
            -- 开始新对象
            local new_obj = {}
            if current_key then
                current[current_key] = new_obj
                current_key = nil
            else
                table.insert(current, new_obj)
            end
            table.insert(stack, current)
            current = new_obj
        elseif char == "}" then
            -- 结束对象
            if #stack > 0 then
                current = table.remove(stack)
            end
        elseif char == "[" then
            -- 开始新数组
            local new_array = {}
            if current_key then
                current[current_key] = new_array
                current_key = nil
            else
                table.insert(current, new_array)
            end
            table.insert(stack, current)
            current = new_array
        elseif char == "]" then
            -- 结束数组
            if #stack > 0 then
                current = table.remove(stack)
            end
        elseif char == '"' then
            -- 解析字符串
            local str_start = i + 1
            local str_end = content:find('"', str_start)
            if str_end then
                local str = content:sub(str_start, str_end - 1)
                if current_key then
                    current[current_key] = str
                    current_key = nil
                else
                    table.insert(current, str)
                end
                i = str_end
            end
        elseif char == ":" then
            -- 键值分隔符
            if type(current) == "table" and not current_key then
                -- 这里需要从栈中获取最后一个字符串作为键
                -- 简化处理：假设键在冒号之前
            end
        elseif char == "," then
            -- 分隔符，忽略
        end
        
        i = i + 1
    end
    
    print("[DEBUG] 内置解析器完成")
    return result
end

-- 通用配置文件加载方法
function config_loader.load_config_by_name(config_file_name)
    local file_path = CONFIG_BASE_PATH .. config_file_name
    print("[DEBUG] 尝试加载配置文件: " .. file_path)
    
    local file = io.open(file_path, "r")
    if not file then
        print("[ERROR] 配置文件不存在: " .. file_path)
        return nil
    end
    
    local content = file:read("*all")
    file:close()
    
    if not content or content == "" then
        print("[ERROR] 配置文件为空: " .. file_path)
        return nil
    end
    
    -- 使用新的JSON解析器
    local config = parse_json_simple(content)
    
    -- 首先尝试使用嵌套JSON解析器
    local success, result = pcall(function()
        return parse_nested_json(content)
    end)
    
    if success and result then
        print("[DEBUG] 使用嵌套JSON解析器成功")
        config = result
    else
        print("[DEBUG] 嵌套JSON解析失败，尝试简单解析")
        -- 回退到简单的JSON解析（支持基本的键值对）
        config = {}
        for line in content:gmatch("[^\r\n]+") do
            local key, value = parse_config_line(line)
            if key and value then
                config[key] = value
                print("[DEBUG] 解析配置: " .. key .. " = " .. tostring(value))
            end
        end
    end
    
    if not config or (type(config) == "table" and next(config) == nil) then
        print("[ERROR] 配置文件解析失败: " .. file_path)
        return nil
    end
    
    print("[DEBUG] 配置文件加载成功: " .. file_path)
    return config
end

-- 获取配置文件列表
function config_loader.list_config_files()
    print("[DEBUG] 获取配置文件列表: " .. CONFIG_BASE_PATH)
    
    -- 创建临时脚本文件来列出目录内容
    local temp_script = CONFIG_BASE_PATH .. "list_files.sh"
    local temp_output = CONFIG_BASE_PATH .. "file_list.txt"
    
    -- 写入脚本内容
    local script_file = io.open(temp_script, "w")
    if script_file then
        script_file:write("#!/bin/sh\n")
        script_file:write("ls -1 " .. CONFIG_BASE_PATH .. "*.json > " .. temp_output .. "\n")
        script_file:close()
        
        -- 执行脚本
        os.execute("chmod +x " .. temp_script)
        os.execute(temp_script)
        
        -- 读取结果
        local result_file = io.open(temp_output, "r")
        if result_file then
            local file_list = {}
            for line in result_file:lines() do
                -- 提取文件名（去掉路径）
                local filename = line:match("([^/]+)$")
                if filename then
                    table.insert(file_list, filename)
                end
            end
            result_file:close()
            
            -- 清理临时文件
            os.remove(temp_script)
            os.remove(temp_output)
            
            print("[DEBUG] 找到配置文件: " .. table.concat(file_list, ", "))
            return file_list
        end
        
        -- 清理临时文件
        os.remove(temp_script)
    end
    
    print("[WARNING] 无法获取配置文件列表")
    return {}
end

-- 保存配置到指定文件
function config_loader.save_config_by_name(config_file_name, config_data)
    local file_path = CONFIG_BASE_PATH .. config_file_name
    print("[DEBUG] 保存配置到文件: " .. file_path)
    
    -- 确保目录存在
    os.execute("mkdir -p " .. CONFIG_BASE_PATH)
    
    local file = io.open(file_path, "w")
    if not file then
        print("[ERROR] 无法创建配置文件: " .. file_path)
        return false
    end
    
    -- 生成JSON格式内容
    local content = "{\n"
    local first = true
    for key, value in pairs(config_data) do
        if not first then
            content = content .. ",\n"
        end
        first = false
        
        if type(value) == "string" then
            content = content .. string.format('  "%s": "%s"', key, value)
        elseif type(value) == "number" then
            content = content .. string.format('  "%s": %d', key, value)
        elseif type(value) == "boolean" then
            content = content .. string.format('  "%s": %s', key, value and "true" or "false")
        else
            content = content .. string.format('  "%s": "%s"', key, tostring(value))
        end
    end
    content = content .. "\n}"
    
    file:write(content)
    file:close()
    
    print("[DEBUG] 配置文件保存成功: " .. file_path)
    return true
end

-- 检查配置文件是否存在
function config_loader.config_file_exists(config_file_name)
    local file_path = CONFIG_BASE_PATH .. config_file_name
    local file = io.open(file_path, "r")
    if file then
        file:close()
        return true
    end
    return false
end



-- 内存中的时间戳变量
local runtime_timestamp = os.time()

-- 更新内存中的时间戳（高性能）
function config_loader.update_runtime_timestamp()
    runtime_timestamp = os.time()
    print("[DEBUG] 内存时间戳更新成功: " .. runtime_timestamp)
    return true
end



-- 检查是否超时（使用内存时间戳，高性能）
function config_loader.check_timeout()
    local current_time = os.time()
    local time_diff = current_time - runtime_timestamp
    local timeout_minutes = 10
    local timeout_seconds = timeout_minutes * 60
    
    print("[DEBUG] 当前时间: " .. current_time .. ", 内存时间戳: " .. runtime_timestamp .. ", 时间差: " .. time_diff .. "秒")
    
    if time_diff > timeout_seconds then
        print("[WARNING] 脚本超时 " .. timeout_minutes .. " 分钟，准备重启")
        return true
    end
    
    return false
end

-- 监控线程函数
function config_loader.monitor_thread()
    print("[DEBUG] 监控线程启动")
    
    -- 第一次启动时等待一段时间再开始检查
    print("[DEBUG] 监控线程等待5秒后开始检查...")
    sleep(5000)  -- 等待5秒
  
    while true do
        -- 检查是否超时
        if config_loader.check_timeout() then
            print("[WARNING] 检测到超时，重启脚本")
            sleep(1000)  -- 等待1秒
            restartScript()  -- 重启脚本
            break
        end
        
        -- 等待30秒再次检查
        print("[DEBUG] 监控线程等待30秒后再次检查")
        sleep(30000)  -- 30秒 = 30000毫秒
    end
end

-- 启动监控线程
function config_loader.start_monitor()
    print("[DEBUG] 启动配置监控线程")
    beginThread(config_loader.monitor_thread)
end





-- 从wildHang.json随机选择地区和地点
function config_loader.get_random_wild_hang_location()
    local wild_hang_data = config_loader.load_config_by_name(config.CONFIG_PATHS.FILENAMES.WILD_HANG_CONFIG)
    if not wild_hang_data then
        print("[WARNING] wildHang.json配置文件不存在")
        return "", ""
    end
    
    -- 检查regions字段
    if not wild_hang_data.regions then
        print("[WARNING] wildHang.json中缺少regions字段")
        return "", ""
    end
    
    -- 过滤出有地点的地区
    local valid_regions = {}
    for _, region in ipairs(wild_hang_data.regions) do
        if region and region.name and region.areas and type(region.areas) == "table" and #region.areas > 0 then
            table.insert(valid_regions, region)
        end
    end
    
    if #valid_regions == 0 then
        print("[WARNING] wildHang.json中没有有效的地区数据（所有地区都没有地点）")
        return "", ""
    end
    
    -- 随机选择一个有效地区
    local random_region_index = math.random(1, #valid_regions)
    local selected_region = valid_regions[random_region_index]
    
    -- 随机选择该地区的一个地点
    local areas = selected_region.areas
    local random_area_index = math.random(1, #areas)
    local selected_area = areas[random_area_index]
    
    if not selected_area or not selected_area.name then
        print("[WARNING] 选中的地点数据格式错误")
        return "", ""
    end
    
    print("[DEBUG] 从wildHang.json随机选择 - 地区: " .. selected_region.name .. ", 地点: " .. selected_area.name)
    return selected_region.name, selected_area.name
end

-- 获取目标地图和位置（从wildHang.json随机选择）
function config_loader.get_target_map_and_position()
    -- 从wildHang.json随机选择
    local wild_map, wild_position = config_loader.get_random_wild_hang_location()
    return wild_map, wild_position
end

-- 重新加载配置（用于配置文件更新时）
function config_loader.reload_config()
    print("[INFO] 重新加载配置文件...")
    local map, position = config_loader.get_target_map_and_position()
    if map ~= "" and position ~= "" then
        print("[INFO] 配置文件重新加载成功")
        print("[INFO] 目标地图: " .. map)
        print("[INFO] 目标位置: " .. position)
        return true
    else
        print("[ERROR] 配置文件重新加载失败")
        return false
    end
end

-- 初始化配置（在脚本启动时调用）
function config_loader.init()
    print("[DEBUG] 初始化用户配置...")
    
    -- 检查配置文件是否存在
    local config_files = {
        config.CONFIG_PATHS.HANG_CONFIG,
        config.CONFIG_PATHS.WILD_HANG_CONFIG,
        config.CONFIG_PATHS.ACCOUNT_CONFIG
    }
    
    for _, file_path in ipairs(config_files) do
        local file = io.open(file_path, "r")
        if file then
            file:close()
            print("[DEBUG] 配置文件存在: " .. file_path)
        else
            print("[WARNING] 配置文件不存在: " .. file_path)
        end
    end
    
    local map, position = config_loader.get_target_map_and_position()
    if map ~= "" and position ~= "" then
        print("[DEBUG] 用户配置初始化成功")
        print("[DEBUG] 目标地图: " .. map)
        print("[DEBUG] 目标位置: " .. position)
        
        -- 脚本启动时立即更新内存时间戳
        print("[DEBUG] 脚本启动，更新内存时间戳")
        config_loader.update_runtime_timestamp()
        
        -- 启动监控线程
        config_loader.start_monitor()
        
        return true
    else
        print("[ERROR] 用户配置初始化失败")
        print("[ERROR] 请检查配置文件是否存在且包含正确的地图和位置信息")
        return false
    end
end

-- 便利方法：加载账号配置
function config_loader.load_account_config()
    return config_loader.load_config_by_name(config.CONFIG_PATHS.FILENAMES.ACCOUNT_CONFIG)
end

-- 便利方法：加载用户凭据
function config_loader.load_user_credentials()
    return config_loader.load_config_by_name(config.CONFIG_PATHS.FILENAMES.USER_CREDENTIALS)
end

-- 便利方法：加载挂机配置
function config_loader.load_hang_config()
    return config_loader.load_config_by_name(config.CONFIG_PATHS.FILENAMES.HANG_CONFIG)
end

-- 便利方法：保存账号配置
function config_loader.save_account_config(config_data)
    return config_loader.save_config_by_name(config.CONFIG_PATHS.FILENAMES.ACCOUNT_CONFIG, config_data)
end

-- 便利方法：保存用户凭据
function config_loader.save_user_credentials(config_data)
    return config_loader.save_config_by_name(config.CONFIG_PATHS.FILENAMES.USER_CREDENTIALS, config_data)
end

-- 便利方法：保存挂机配置
function config_loader.save_hang_config(config_data)
    return config_loader.save_config_by_name(config.CONFIG_PATHS.FILENAMES.HANG_CONFIG, config_data)
end

-- 便利方法：加载日常任务配置
function config_loader.load_daily_mission_config()
    return config_loader.load_config_by_name(config.CONFIG_PATHS.FILENAMES.DAILY_MISSION)
end

-- 便利方法：保存日常任务配置
function config_loader.save_daily_mission_config(config_data)
    return config_loader.save_config_by_name(config.CONFIG_PATHS.FILENAMES.DAILY_MISSION, config_data)
end

-- 便利方法：加载日程任务配置
function config_loader.load_daily_task_config()
    return config_loader.load_config_by_name(config.CONFIG_PATHS.FILENAMES.DAILY_TASK)
end

-- 便利方法：保存日程任务配置
function config_loader.save_daily_task_config(config_data)
    return config_loader.save_config_by_name(config.CONFIG_PATHS.FILENAMES.DAILY_TASK, config_data)
end

-- 获取日程安排配置
function config_loader.get_daily_task_config()
    local config_data = config_loader.load_daily_task_config()
    if config_data then
        return config_data
    end
    return nil
end

-- 获取每日任务配置
function config_loader.get_daily_mission_config()
    local config_data = config_loader.load_daily_mission_config()
    if config_data then
        return config_data
    end
    return nil
end

-- 检查日程安排是否启用
function config_loader.is_daily_task_enabled()
    return config.DAILY_TASK_CONFIG.enabled
end

-- 检查每日任务是否启用
function config_loader.is_daily_mission_enabled()
    return config.DAILY_MISSION_CONFIG.enabled
end

-- 获取指定配置文件中的某个键值
function config_loader.get_config_value(config_file_name, key, default_value)
    local config = config_loader.load_config_by_name(config_file_name)
    if config and config[key] ~= nil then
        return config[key]
    end
    return default_value
end

-- 设置指定配置文件中的某个键值
function config_loader.set_config_value(config_file_name, key, value)
    local config = config_loader.load_config_by_name(config_file_name)
    if not config then
        config = {}
    end
    
    config[key] = value
    return config_loader.save_config_by_name(config_file_name, config)
end

return config_loader 